<?php

namespace app\model;

use think\Model;
use think\model\concern\SoftDelete;
use EasyWeChat\Factory;

class Pay extends Model
{
    use SoftDelete;
    protected $deleteTime = 'delete_at';
    protected $defaultSoftDelete = 0;
    /**
     * 自动时间戳数据类型
     *
     * @var string
     */
    protected $autoWriteTimestamp = 'int';
    protected $createTime = 'create_at';
    protected $updateTime = null;
    /**
     * 关联的数据表。
     *
     * @var string
     */
    protected $table = 'pay';
    /**
     * 属性默认值。
     *
     * @var array<int, string>
     */
    protected $attribute = [
        'memo' => '',  // 备注
        'amount'  => '',  // 金额
        'trade_state' => '', // 支付状态
        'trade_state_desc' => '', // 支付状态描述
        'pay_at' => 0, // 支付时间
    ];
    /**
     * The attributes that are mass assignable.
     *
     * @var array<string>
     */
    protected $field = [
        'id', // ID
        'user_id', //
        'memo',  // 备注',
        'amount' ,  // 金额',
        'out_trade_no', // 外部交易号
        'trade_state', // 支付状态
        'trade_state_desc', // 支付状态描述
        'pay_at', // 支付时间
        'status', // 状态
        'info_id', // 
        'info_type' // 
    ];
    /**
     * The attributes that should be cast.
     *
     * @var array<string>
     */
    protected $type = [
        'create_at' => 'timestamp:Y-m-d H:i:s',
        'pay_at' => 'timestamp:Y-m-d H:i:s'
    ];
    public function searchStatusAttr($query, $value, $data)
    {
        !empty($value) && $query->where('status', $value);
    }
    public function searchUserIdAttr($query, $value, $data)
    {
        $value > 0 && $query->where('user_id', $value);
    }
    /**
     * 所属用户
     *
     * @return void
     */
    public function user(){
        return $this->belongsTo('User','user_id')->bind(['user_name' => 'mobile']);
    }
    public static function onBeforeInsert($model)
    {
        $model->user_id = request()->uid;
        $model->status = 1;
        $model->out_trade_no = date('YmdHis') . mt_rand(1000, 9999);
    }
    public static function onAfterUpdate($model)
    {
        if($model->status !== 2 && $model->getOrigin('status') === 2){
            event('PayFinish', $model);
        }
    }
    public function info()
    {
        return $this->morphTo('info',[
            '',
        	'app\model\ActivityEnroll',
        	'app\model\UserVip',
        ]);
    }
    /**
     * 获取支付参数
     *
     * @return void
     */
    public function getPayParamsAttr()
    {
        $app = Factory::payment(config('wechat.pay'));
        $result = $app->order->unify([
            'body' => $this->memo,
            'out_trade_no' => $this->out_trade_no,
            // 'total_fee' => $this->amount,
            'total_fee' => 1,
            'spbill_create_ip' => request()->ip(), // 可选，如不传该参数，SDK 将会自动获取相应 IP 地址
            'notify_url' => url('pay/notify')->domain(true), // 支付结果通知网址，如果不设置则会使用配置里的默认地址
            'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
            'openid' => request()->openid,
        ]);
        $config = $app->jssdk->bridgeConfig($result['prepay_id'], false); // 返回数组
        return $config;
    }
}
